﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.EnterpriseServices;
using Bowling.Game;

namespace Bowling
{
    /// <summary>
    /// Bowling_Tx에 대한 요약 설명입니다.
    /// </summary>
    [Transaction(TransactionOption.Required)]
    
    public class BowlingBiz_Tx : Arche.EnterpriseServices.BizBase
    {
        public BowlingBiz_Tx()
        {
        }

        /// <summary>
        /// 로그인을 위해 ID와 패스워드를 DB에서 검색
        /// 아이디가 존재하면 true 리턴, 존재하지 않으면 false리턴
        /// </summary>
        /// <remarks>
        /// 작성자: 권혁준
        /// </remarks>
        /// <param name="userID"></param>
        /// <param name="userPW"></param>
        /// <returns></returns>
        public bool LoginBowlingGame(String userID, String userPW)
        {
            return new BowlingDac().SelectBowlingGameUserLogin(userID, userPW);
        }

        /// <summary>
        /// 새로운 사용자가 입장하면 아이디와 현재 시간을 DB에 저장합니다.
        /// </summary>
        /// <param name="gameInfo"></param>
        /// <returns>리턴값은 새로 기록된 SEQ 번호를 리턴합니다.</returns>
        public int AddBowlingNewGame(GameInfo gameInfo)
        {
            return new BowlingDac().InsertBolwingNewGame(gameInfo);
        }

        /// <summary>
        /// 게임이 진행중에 프레임이 바뀌거나 게임 저장 버튼이 눌리면 현재 사용 유저의 기록에 업데이트 합니다.
        /// </summary>
        /// <param name="gameInfo"></param>
        public void AddBowlingGameScore(GameInfo gameInfo, GamePlay gamePlay)
        {
            new BowlingDac().UpdateBowlingGameScore(gameInfo, gamePlay);
        }

        /// <summary>
        /// 모든 게임 기록을 리턴합니다.
        /// </summary>
        /// <returns></returns>
        public BowlingHyukwon_RecordT[] ShowBowlingGameScoreRecord()
        {
            BowlingHyukwon_RecordT[] bhr = new BowlingDac().SelectBowlingGameScoreRecord();
            return bhr;
        }

        /// <summary>
        /// 아이디가 인증 된 상태에서 기록 보기 버튼이 눌리면
        /// 현재 아이디의 유저기록을 볼 수 있습니다.
        /// </summary>
        /// <returns></returns>
        public BowlingHyukwon_RecordT[] ShowBowlingGameScoreRecord(String userID)
        {
            BowlingHyukwon_RecordT[] bhr = new BowlingDac().SelectBowlingGameScoreRecord(userID);
            return bhr;
        }

        /// <summary>
        /// 입력된 SEQ 기록 일련번호로 DB 데이터를 삭제합니다.
        /// </summary>
        /// <param name="seq"></param>
        public void RemoveBowlingGameScore(int seq)
        {
            new BowlingDac().DeleteBowlingGameScoreRecord(seq);
        }

        /// <summary>
        /// 입력된 아이디를 DB의 유저 테이블에서 중복을 확인합니다.
        /// 아이디가 존재하지 않으면 등록 페이지에서 사용자를 새로 등록합니다.
        /// </summary>
        /// <param name="userID">아이디</param>
        /// <param name="userPW">패스워드</param>
        /// <param name="userName">이름</param>
        /// <param name="avg">에버리지</param>
        /// <returns></returns>
        public bool AddBowlingNewUser(String userID, String userPW, String userName, int avg)
        {
            bool idExists = new BowlingDac().SelectBowlingGameIdCheck(userID);  //아이디 유무 확인

            if (idExists == false)      //등록 성공
            {
                new BowlingDac().InsertBolwingNewUser(userID, userPW, userName, avg);
                return true;
            }
            else
            {
                return false;       //등록 실패
            }
            
        }

        /// <summary>
        /// 새로운 유저가 입장하였을때 DB에서 유저 정보를 읽어와 셋팅합니다.
        /// 유저가 로그인 상태가 아니라면 Default 값들을 입력합니다.
        /// </summary>
        /// <param name="userInfo"></param>
        public void SetUserInfo(UserInfo userInfo)
        {
            if(userInfo.userID.Equals("NO ID"))
            {
                userInfo.userName = "";
                userInfo.password = "";
                userInfo.average = 0;
            }
            else
            {
                BowlingHyukwon_UserT bhu = new BowlingDac().SelectBowlingGameUserInfo(userInfo.userID);
                userInfo.userName = bhu.USERNAME;
                userInfo.password = bhu.PSWORD;
                userInfo.average = bhu.AVERAGE;
            }
            
        }

        /// <summary>
        /// 로드 번호 입력과 로그인 되어있는 유저 아이디로 기존 기록 유무 확인
        /// 후에 존재한다면, 선택된 기록 일련번호를 리턴한다.
        /// </summary>
        /// <param name="userID">현재 로그인 상태의 아이디</param>
        /// <param name="seqLoad">로드를 원하는 기록 일련번호</param>
        /// <returns></returns>
        public int CheckLastRecordExist(String userID, int seqLoad)
        {
            //입력 번호를 입력하지 않고 로드 버튼을 눌렀을 때 제일 마지막 기록을 검색
            if (seqLoad == 0)
            {
                return new BowlingDac().SelectBowlingGameLastRecord(userID);
            }
            
            else
            {
                return new BowlingDac().SelectBowlingGameLastRecord(userID, seqLoad);
            }
            
        }

        //기존의 기록이 있는지 유무확인
        public int CheckLastRecordExist(String userID)
        {
            return new BowlingDac().SelectBowlingGameLastRecord(userID);

        }

        /// <summary>
        /// 로드 버튼 이벤트 발생시에 선택된 데이터를 현재 GameInfo에 셋하여 줍니다.
        /// </summary>
        /// <param name="seqLastRecord">선택된 지난 기록 일련번호</param>
        /// <param name="gameInfo">현재 진행중인 Gameinfo</param>
        /// <param name="userInfo"></param>
        /// <param name="gamePlay"></param>
        public void SetLastRecord(int seqLastRecord, GameInfo gameInfo, UserInfo userInfo, GamePlay gamePlay)
        {
            BowlingHyukwon_RecordT bhr = new BowlingDac().SelectBowlingGameLastRecord(seqLastRecord);

            gameInfo.userInfo = userInfo;
            //지난 경기에서 게임이 중지된 프레임 번호
            gamePlay.frameNo = bhr.LAST_FRAME_NO;

            gameInfo.playDate = bhr.PLAYDATE;
            gameInfo.score[0] = bhr.__SCORE1;
            gameInfo.score[1] = bhr.__SCORE2;
            gameInfo.score[2] = bhr.__SCORE3;
            gameInfo.score[3] = bhr.__SCORE4;
            gameInfo.score[4] = bhr.__SCORE5;
            gameInfo.score[5] = bhr.__SCORE6;
            gameInfo.score[6] = bhr.__SCORE7;
            gameInfo.score[7] = bhr.__SCORE8;
            gameInfo.score[8] = bhr.__SCORE9;
            gameInfo.score[9] = bhr.__SCORE10;
            gameInfo.throws[0] = bhr.__THROW11;
            gameInfo.throws[1] = bhr.__THROW12;
            gameInfo.throws[2] = bhr.__THROW21;
            gameInfo.throws[3] = bhr.__THROW22;
            gameInfo.throws[4] = bhr.__THROW31;
            gameInfo.throws[5] = bhr.__THROW32;
            gameInfo.throws[6] = bhr.__THROW41;
            gameInfo.throws[7] = bhr.__THROW42;
            gameInfo.throws[8] = bhr.__THROW51;
            gameInfo.throws[9] = bhr.__THROW52;
            gameInfo.throws[10] = bhr.__THROW61;
            gameInfo.throws[11] = bhr.__THROW62;
            gameInfo.throws[12] = bhr.__THROW71;
            gameInfo.throws[13] = bhr.__THROW72;
            gameInfo.throws[14] = bhr.__THROW81;
            gameInfo.throws[15] = bhr.__THROW82;
            gameInfo.throws[16] = bhr.__THROW91;
            gameInfo.throws[17] = bhr.__THROW92;
            gameInfo.throws[18] = bhr.__THROW101;
            gameInfo.throws[19] = bhr.__THROW102;
            gameInfo.throws[20] = bhr.__THROW103;

        }

        /// <summary>
        /// 리피터에 셋해줄 데이터
        /// 1번부터 9번 프레임까지 새로 추가한 테이블의 데이터를 리턴
        /// </summary>
        /// <returns></returns>
        public BowlingHyukwon_SetScoreT[] GetBowlingScore_1_9()
        {
            return new BowlingDac().SelectBowlingGameScore_1_9();
        }

        /// <summary>
        /// 리피터에 셋해줄 새로 추가한 테이블의 10번 프레임 데이터 리턴
        /// </summary>
        /// <returns></returns>
        public BowlingHyukwon_SetScoreT GetBowlingScore_10()
        {
            return new BowlingDac().SelectBowlingGameScore_10();
        }

        /// <summary>
        /// 임시 메소드 
        /// 새로운 테이블을 Truncate하는 함수
        /// </summary>
        public void DeleteBowlingFrameScore()
        {
            new BowlingDac().DeleteBowlingFrameScore();
        }


    }
}
